package com.wn;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.wn.bean.User;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;

import javax.annotation.Resource;

/**
 * @author yellow Docter
 * @date 2023 -06-19
 * @desc
 */
//@SpringBootTest
public class RedisTest02 {

    /**
     * RedisTemplate<K,V>
     * k 、v 需要给泛型  如果不给 操作是  obj类型
     * 使用的时候 k 一般都是给 String
     * V  根据需求给 (Integer 计数、String验证码 、User 对象 )
     * <p>
     * RedisTemplate<String,String>  使用的最多就是这个写法
     * <p>
     * StringRedisTemplate redis 操作 字符的模板类型
     * <p>
     * RedisTemplate 和 StringRedisTemplate 区别?
     * 1、RedisTemplate 操作如果给的是String泛型 和 StringRedisTemplate 一样
     * 如果不给泛型  RedisTemplate 操作的是对象
     * <p>
     * 2、 StringRedisTemplate extends RedisTemplate<String,String>
     * StringRedisTemplate 做了什么操作?
     * 配置了序列化
     * RedisTemplate 内部使用的 obj的序列化操作
     * StringRedisTemplate  字符串序列化
     */
//    @Autowired
//    private RedisTemplate<String, String> redisTemplate;

//    @Autowired
//    private StringRedisTemplate stringRedisTemplate;

    @Test
    public void demo01() {
        //方法还是一样
        //  stringRedisTemplate.opsForValue().set("msg","hello");
    }

    /**
     * 如何把对象存储到 redis中?
     * <p>
     * 对象存储到文件中如何存储?
     * 1、object流
     * 存储到文件中: 二进制、看不懂
     * DefaultSerializer requires a Serializable payload but received an object of type [com.wn.bean.User]
     * 对象到 文件中 需要 序列化
     * redisTemplate 如果直接存储对象:
     * 内部就是使用的 ObjectOutputStream   直接把对象转成 二进制存储
     * <p>
     * 2、序列化json 存储到 文件
     * 存储到文件中: json字符串、看的懂
     *
     * 3、通过配置类来配置redis的序列化 器
     */

    @Test
    public void demo02() throws JsonProcessingException {

//        User user = new User();
//        user.setName("张无忌");
//        user.setId(12);
//        redisTemplate.opsForValue().set("u1",user);
//
//        //把对象转成 json 字符串
//        //spring 默认 集成的 json框架
//        //序列化    把对象转成json           writeValueAsString
//
//        //反序列化  把json转成对象            objectMapper.readValue(s1, User.class);
//        ObjectMapper objectMapper = new ObjectMapper();
//        String s = objectMapper.writeValueAsString(user);
//
//        //在通过 redisTemplate 进行存储
//        redisTemplate.opsForValue().set("u1", s);
//
//        //读取
//        //json字符串
//        String s1 = redisTemplate.opsForValue().get("u1");
//        System.out.println("s1 = " + s1);
//
        //
//        User user1 = objectMapper.readValue(s1, User.class);
//        System.out.println("user1 = " + user1);

    }

    @Test
    public void demo03() throws JsonProcessingException {
//        ObjectMapper objectMapper = new ObjectMapper();
//        //读取
//        //json字符串
//        String s1 = redisTemplate.opsForValue().get("u1");
//        System.out.println("s1 = " + s1);
//
//        //反序列化  把json转成对象
//        User user1 = objectMapper.readValue(s1, User.class);
//        System.out.println("user1 = " + user1);
    }

}
